#include "protocol.h"

u8 RxTemp[12];  //临时保存串口接收到的待用数据
u8 Fcn;  //功能字节
u8 RcvCnt=0;

u8 Data_Receive_Precess(u8 RxData)
{
    static u8 RxState=0,cnt=0,sum,Len;
    switch(RxState){
    case 0:  //帧头校验
        if(RxData=='<'){
            sum=RxData;
            RxState=1;
        }
        break;
    case 1:  //功能字校验与保存
        sum+=RxData;
        Fcn=RxData;
        RxState=2;
        break;
    case 2:  //数据长度校验与保存
        if(RxData<=12)
        {
            sum+=RxData;
            Len=RxData;
            RxState=3;
        }
        else
        {
            sum=0;
            RxState=0;
        }
        break;
    case 3:  //临时保存待用数据
        sum+=RxData;
        RxTemp[cnt++]=RxData;
        if(cnt>=Len)
            RxState=4;
        break;
    case 4:  //匹配校验和
        RxState=0; 
        cnt=0;
        if(sum!=RxData){
            sum=0;
            return 2;  //数据帧出错
        }
        sum=0;
        return 0;  //收到了正确的数据帧
    default:
        RxState=0;
        sum=0;
        cnt=0;
        return 2;  //数据帧出错
    }
    return 1;  //数据帧尚未接收完成
}

u8 Send_u16_data(u16 *data, u8 fcn, u8 len, void(*Send_Fcn)(u8 *data, u8 len))
{
    u8 i,cnt = 0,sum = 0x3E + fcn + (len<<1);
    u8 DataToSend[12];
    u8 datatemp;
    DataToSend[cnt++]=0x3E;
    DataToSend[cnt++]=fcn;
    DataToSend[cnt++]=len<<1;
    for (i=0;i<len;++i){
        datatemp=BYTE1(data[i]);
        DataToSend[cnt++]=datatemp;
        sum+=datatemp;
        datatemp=BYTE0(data[i]);
        DataToSend[cnt++]=datatemp;
        sum+=datatemp;
    }
    DataToSend[cnt++]=sum;
    Send_Fcn(DataToSend,cnt);
    return cnt;
}

u8 Send_u8_data(u8 data, u8 fcn, void(*Send_Fcn)(u8 *data, u8 len))
{
    u8 DataToSend[5];
    DataToSend[0]=0x3E;
    DataToSend[1]=fcn;
    DataToSend[2]=0x01;
    DataToSend[3]=data;
    DataToSend[4]=0x3F+data+fcn;
    Send_Fcn(DataToSend,5);
    return 5;
}
